package controle.acesso.dao;


import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import controle.acesso.model.Grupo;

import utils.Constantes;
import utils.Utils;

public class GrupoDao extends GenericDao{
	


private int numerodecampos = 2;
	
	public GrupoDao(){
		super();
	}


public PreparedStatement adicionar(Grupo grupo) throws SQLException{
		
		String sql = "insert into grupo(nome,descricao) values (?,?)";
		this.setQuery(sql);
		ArrayList<Integer> indexes=new ArrayList<Integer>();
		for (int i=0;i<numerodecampos;i++)
			indexes.add(i,i+1);
		indexes.add(numerodecampos,null);
		
		PreparedStatement stmt = this.loadModelToPreparedStatement(grupo,indexes);
		
		stmt.execute();	
		this.setQuery(stmt.toString());

		stmt.close();
		
		con.close();
		return stmt;
		
	}	

public PreparedStatement desativar(Grupo grupo) throws SQLException{
	String sql = "update grupo set ativo = 'N' where idgrupo = ?";
	this.setQuery(sql);
	ArrayList<Integer> indexes=new ArrayList<Integer>();
	for (int i=0;i<numerodecampos;i++)
		indexes.add(i,null);
	indexes.add(numerodecampos,1);
	PreparedStatement stmt = this.loadModelToPreparedStatement(grupo, indexes);
	
	stmt.execute();
	this.setQuery(stmt.toString());

	stmt.close();
	
	con.close();
	return stmt;
	
	

}

public PreparedStatement ativar(Grupo grupo) throws SQLException{
	
	String sql = "update grupo set ativo = 'S' where idgrupo = ?";
	this.setQuery(sql);
	ArrayList<Integer> indexes=new ArrayList<Integer>();
	for (int i=0;i<numerodecampos;i++)
		indexes.add(i,null);
	indexes.add(numerodecampos,1);
	PreparedStatement stmt = this.loadModelToPreparedStatement(grupo, indexes);
	
	stmt.execute();
	this.setQuery(stmt.toString());

	stmt.close();
	
	con.close();
	return stmt;
	
	

}


	public PreparedStatement apagar(Grupo grupo) throws SQLException{
	String sql = "delete from grupo where idgrupo = ?";
	this.setQuery(sql);
	
	ArrayList<Integer> indexes=new ArrayList<Integer>();
	for (int i=0;i<numerodecampos;i++)
		indexes.add(i,null);
	indexes.add(numerodecampos,1);
	
	PreparedStatement stmt = this.loadModelToPreparedStatement(grupo, indexes);
	
	stmt.execute();
	this.setQuery(stmt.toString());

	stmt.close();
	
	con.close();
	return stmt;
	
	

}

public PreparedStatement alterar(Grupo grupo) throws SQLException{
	
	String sql = "update grupo set nome = ?,descricao = ?" +
			" where idgrupo = ? and ativo = 'S'";
	this.setQuery(sql);
	ArrayList<Integer> indexes=new ArrayList<Integer>();
	for (int i=0;i<=numerodecampos;i++)
		indexes.add(i,i+1);
	
	
	PreparedStatement stmt =this.loadModelToPreparedStatement(grupo,indexes); 
	
	stmt.execute();
	
	this.setQuery(stmt.toString());

	stmt.close();
	
	con.close();
	return stmt;
	
}

public Integer countGetGrupos(Grupo grupoBusca) throws SQLException{
	if (grupoBusca==null) return null;
	String sql = "select count(*) as count from grupo where 1=1";		
	this.setQuery(sql);
	this.addAtivo(grupoBusca.getAtivo().charAt(0));
	ArrayList<Integer> restrictions=this.prepareRestrictionsQuery(grupoBusca);
	
	PreparedStatement stmt =this.addRestrictions(grupoBusca, restrictions);
			
	ResultSet rs = stmt.executeQuery();
	Integer count = new Integer(0);
	
	while(rs.next()){
		if (!Utils.isBlank(rs.getInt(Constantes.COUNT)))
			count=rs.getInt(Constantes.COUNT);
	} 
	this.setQuery(stmt.toString());

	stmt.close();
	rs.close();
	con.close();
	
	return count;
}




public ArrayList<Grupo> getGrupos(Grupo grupoBusca, int limite, int inicio) throws SQLException{
	if (grupoBusca==null) return null;
	String sql = "select * from grupo where 1=1";		
	this.setQuery(sql);
	this.addAtivo(grupoBusca.getAtivo().charAt(0));
	ArrayList<Integer> restrictions=this.prepareRestrictionsQuery(grupoBusca);
	this.addOrder("asc","nome");
	this.addLimit(limite,inicio);
	
	PreparedStatement stmt =this.addRestrictions(grupoBusca, restrictions);
			
	ResultSet rs = stmt.executeQuery();
	Grupo grupo = null;
	ArrayList<Grupo> grupos=new ArrayList<Grupo>();
	
	while(rs.next()){
		grupo = this.loadResultSetToModel(rs);
		grupos.add(grupo);
		
	} 
	this.setQuery(stmt.toString());

	stmt.close();
	rs.close();
	con.close();
	
	return grupos;
}





private PreparedStatement addRestrictions(Grupo grupo,
		ArrayList<Integer> restrictions) throws SQLException {
PreparedStatement stmt=con.prepareStatement(this.getQuery());
	
	if (!Utils.isBlank(restrictions.get(0)))
		stmt.setString(restrictions.get(0), "%"+grupo.getNome()+"%");
	
	if (!Utils.isBlank(restrictions.get(1)))
		stmt.setString(restrictions.get(1), "%"+grupo.getDescricao()+"%");
	
	if (!Utils.isBlank(restrictions.get(2)))
		stmt.setInt(restrictions.get(2), grupo.getId());
	return stmt;
}





private PreparedStatement loadModelToPreparedStatement(Grupo grupo ,ArrayList<Integer> indexes) throws SQLException{
	PreparedStatement stmt=con.prepareStatement(this.getQuery());
	
	if (!Utils.isBlank(indexes.get(0)))
		stmt.setString(indexes.get(0), grupo.getNome());
	
	if (!Utils.isBlank(indexes.get(1)))
		stmt.setString(indexes.get(1), grupo.getDescricao());
	
	if (!Utils.isBlank(indexes.get(2)))
		stmt.setInt(indexes.get(2), grupo.getId());
	
	return stmt;
}


private Grupo loadResultSetToModel(ResultSet rs) throws SQLException {
	Grupo grupo = new Grupo();
	
	if (!Utils.isBlank(rs.getInt(Constantes.IDGRUPO)))
		grupo.setId(rs.getInt(Constantes.IDGRUPO));
	
	if (!Utils.isBlank(rs.getString(Constantes.NOME)))
		grupo.setNome(rs.getString(Constantes.NOME));
	
	if (!Utils.isBlank(rs.getString(Constantes.DESCRICAO)))
		grupo.setDescricao(rs.getString(Constantes.DESCRICAO));
	
	if (!Utils.isBlank(rs.getString(Constantes.ATIVO)))
		grupo.setAtivo(rs.getString(Constantes.ATIVO));
	
	return grupo;
}





private ArrayList<Integer> prepareRestrictionsQuery(Grupo grupo){
	ArrayList<Integer> restrictions=new ArrayList<Integer>();
	int index=0;
	String sql=this.getQuery();
	
	restrictions.add(0, null);
	if (!Utils.isBlank(grupo.getNome())){
		sql+=" and nome like ?";
		index++;
		restrictions.add(0, index);
	}
	
	
	
	restrictions.add(1, null);
	if (!Utils.isBlank(grupo.getDescricao())){
		sql+=" and descricao like ?";
		index++;
		restrictions.add(1, index);
	}
	
	restrictions.add(2, null);
	if (!Utils.isBlank(grupo.getId())){
		sql+=" and idgrupo = ?";
		index++;
		restrictions.add(2, index);
	}

	
	this.setQuery(sql);
	return restrictions;
}

}
